/**
 * @file AccountBean.java
 * Projet eCOM 2010 (Miage Descartes)
 * @author Doido Sébastien
 * @version 2
 * @brief Bean relatif au traitement d'un compte client/magasin
 */
package ecom.beans;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import javax.ejb.Remote;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

// IBAN :    [a-zA-Z]{2}[0-9]{2}[a-zA-Z0-9]{4}[0-9]{7}([a-zA-Z0-9]?){0,16}
/**
 * @brief Le Bean Account gère le compte d'un acheteur ou celui d'un magasin
 * @author Doido Sébastien
 */
@Entity
@Table(name = "ACCOUNT")
@Remote(AccountRemote.class)
@NamedQueries({
    @NamedQuery(name = "allAccounts", query = "SELECT OBJECT(p) FROM AccountBean p"),
    @NamedQuery(name = "authenticate", query = "SELECT OBJECT(p) FROM AccountBean p where p.login = :login and p.pass = :pass")
})
public class AccountBean implements java.io.Serializable, AccountRemote {

    private static final long serialVersionUID = 1L;
    
    /**
     * @brief Numéro unique identifiant le compte
     */
    private int accountId;

    /**
     * @brief Nom du propriétaire du compte
     */
    private String accountOwner;

    /**
     * @brief Solde du compte
     */
    private double balance;

    /**
     * @brief Login du compte
     */
    private String login;

    /**
     * @brief Mot de passe du compte
     */
    private String pass;

    /**
     * @brief Prénom du propriétaire du compte
     */
    private String surname;

    /**
     * @brief Adresse du propriétaire du compte
     */
    private String address;

    /**
     * @brief Date de naissance du propriétaire du compte
     */
    private String birthdate;


    public AccountBean() {
        super();
    }

    /**
     * @brief Constructeur du compte acheteur/magasin
     * @param accountOwner : nom du propriétaire
     * @param balance : solde
     * @param login : login pour accès management du compte
     * @param pass : mot de passe
     * @param surname : prénom du propriétaire du compte
     * @param address : adresse du propriétaire du compte
     * @param birthdate : date d'anniversaire du propriétaire du compte
     */
    public AccountBean(String accountOwner, double balance, String login, String pass, String surname, String address, String birthdate) {
        this.setAccountId(accountId);
        this.setAccountOwner(accountOwner);
        this.setBalance(balance);
        this.setLogin(login);
        this.setPass(pass);
        this.setSurname(surname);
        this.setAddress(address);
        this.setBirthdate(birthdate);
    }

    /**
     * @brief renvoie le numéro unique identifiant le compte
     * @return  le numéro unique identifiant le compte
     */
    @Id
    @Column(name = "account_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getAccountId() {
        return accountId;
    }

    /**
     * @brief renvoie le nom du propriétaire
     * @return le nom du propriétaire
     */
    public String getAccountOwner() {
        return accountOwner;
    }

    /**
     * @brief renvoie le solde du compte
     * @return le solde du compte
     */
    public double getBalance() {
        return this.balance;
    }

    /**
     * renvoie l'adresse du propriétaire du compte
     * @return l'adresse du propriétaire du compte
     */
    public String getAddress() {
        return address;
    }

    /**
     * @brief renvoie la date de naissance du propriétaire du compte
     * @return  la date de naissance du propriétaire du compte
     */
    public String getBirthdate() {
        return birthdate;
    }

    /**
     * @brief renvoie le login du propriétaire du compte
     * @return le login du propriétaire du compte
     */
    public String getLogin() {
        return login;
    }

    /**
     * @brief renvoie le mot de passe d'accès au compte
     * @return le mot de passe d'accès au compte
     */
    public String getPass() {
        return pass;
    }

    /**
     * @brief renvoie le prénom du propriétaire du compte
     * @return le prénom du propriétaire du compte
     */
    public String getSurname() {
        return surname;
    }

    /**
     * @brief définit le numéro unique identifiant le compte
     * @param accountId : identifiant
     */
    public void setAccountId(int accountId) {
        this.accountId = accountId;
    }

    /**
     * @brief définit le nom du propriétaire
     * @param accountOwner : nom
     */
    public void setAccountOwner(String accountOwner) {
        this.accountOwner = accountOwner;
    }

    /**
     * @brief définit  le solde du compte
     * @param balance : solde
     */
    public void setBalance(double balance) {
        this.balance = balance;
    }

    /**
     * @brief définit l'adresse du propriétaire du compte
     * @param address : adresse
     */
    public void setAddress(String address) {
        this.address = address;
    }

    /**
     * @brief définit la date de naissance du propriétaire du compte
     * @param birthdate : date de naissance
     */
    public void setBirthdate(String birthdate) {
        this.birthdate = birthdate;
    }

    /**
     * @brief définit le login du propriétaire du compte
     * @param login : login
     */
    public void setLogin(String login) {
        this.login = login;
    }

    /**
     * @brief définit le pass du propriétaire du compte
     * @param pass : mot de passe
     */
    public void setPass(String pass) {
        this.pass = pass;
    }

    /**
     * @brief définit le prénom du propriétaire du compte
     * @param surname : prénom
     */
    public void setSurname(String surname) {
        this.surname = surname;
    }

    @Override
    public String toString() {
        return this.getAccountId() + "  | " + this.getAccountOwner() + " " + this.getSurname() + " [" + this.getLogin() + "/" + this.getPass() + "] @'" + this.getAddress() + "' [balance: " + this.getBalance() + " eur]";
    }

    /**
     * @brief : Depot d'argent sur le compte
     * @param amount : montant à déposer
     * @return le nouveau solde
     */
    public double deposit(double amount) {
        this.balance = this.balance + amount;
        Connection con = null;

        try {
            Class.forName ("com.mysql.jdbc.Driver").newInstance ();
            con = DriverManager.getConnection("jdbc:mysql://localhost/ecom", "ecom", "ecom");
            Statement s = con.createStatement();
            s.executeUpdate("update account set balance = '" + balance + "' where account_id = " + this.getAccountId());
            s.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        return balance;
    }

    /**
     * @brief : Retrait d'argent du compte
     * @param amount : montant à retirer
     * @return le nouveau solde
     */
    public double withdraw(double amount) {
        if (balance >= amount) {
            this.balance = balance - amount;
        }
        return balance;
    }
}
